你好,我是富士大顆 Aiko
接下來會介紹關於 Rails 裡的測試,
這篇會講到:
真的不要以為躲得掉...
準備好了嗎?gogo!
不僅可以提高產品品質,還可以加速開發速度,降低風險和成本,或是提供更好的 UX。
單元測試主要針對程式中的最小可測試單元(通常是方法或函數)進行測試,unit 就是指最小組成單位。
** 測試 model user 裡的 full_name **
# app/models/user.rb
class User
def full_name
"#{first_name} #{last_name}"
end
end
# test/models/user_test.rb
require 'test_helper'
class UserTest < ActiveSupport::TestCase
test "should return full name" do
user = User.new(first_name: "Aiko", last_name: "Chen")
assert_equal "Aiko Chen", user.full_name
end
end
針對控制器 Controller 的各個 action 進行測試。
** 測試 controller users 的 index action **
# test/controllers/users_controller_test.rb
require 'test_helper'
class UsersControllerTest < ActionController::TestCase
test "should get index" do
get :index
assert_response :success
end
end
用於測試多個單位或系統之間的互動。
** 測試 navigation 是否會呈現(這個路徑可能多個地方會使用到)**
# test/integration/navigation_test.rb
require 'test_helper'
class NavigationTest < ActionDispatch::IntegrationTest
test "can see the welcome page" do
get "/"
assert_select "h1", "Welcome"
end
end
模擬真實 user 行為,通常使用瀏覽器自動化工具。
** 使用 Capybara 進行端對端測試 **
# spec/features/user_visits_homepage_spec.rb
require 'spec_helper'
feature "User visits homepage" do
scenario "successfully" do
visit root_path
expect(page).to have_content("Welcome")
end
end
** Ruby 中使用 Selenium **
```ruby
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :firefox
driver.navigate.to "http://www.google.com"
element = driver.find_element(name: 'q')
element.send_keys "Hello Selenium"
element.submit
```
** Ruby 中使用 Capybara **
```ruby
visit '/login'
fill_in 'Username', with: 'user'
fill_in 'Password', with: 'password'
click_button 'Login'
```
** Javascript 中使用 Puppeteer **
```javascript
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
await page.screenshot({ path: 'example.png' });
await browser.close();
})();
```
** Javascript 中使用 TestCafe **
```javascript
fixture `Getting Started`
.page `http://devexpress.github.io/testcafe/example`;
test('My first test', async t => {
await t
.typeText('#developer-name', 'John Doe')
.click('#submit-button');
});
```
RSpec 因其使用操作直覺(語感易懂)是 Ruby 社群中最受歡迎的測試框架之一。
安裝:
gem install rspec
** 測試 model user 裡的方法,是否會回傳 full name **
# app/models/user.rb
class User
def full_name
"#{first_name} #{last_name}"
end
end
# spec/models/user_spec.rb
require 'rails_helper'
RSpec.describe User, type: :model do
it "returns full name" do
user = User.new(first_name: "Aiko", last_name: "Chen")
expect(user.full_name).to eq("Aiko Chen")
end
end
Rails 內建的,提供了一個輕量級的測試框架,使用語言較 Repec 不直覺。
** 測試 model user 裡的方法,是否會回傳 full name **
# app/models/user.rb
class User
def full_name
"#{first_name} #{last_name}"
end
end
# test/models/user_test.rb
require 'test_helper'
class UserTest < ActiveSupport::TestCase
test "should return full name" do
user = User.new(first_name: "Aiko", last_name: "Chen")
assert_equal "Aiko Chen", user.full_name
end
end
你可以直接用這兩個例子進行比較,是不是 Rspec 比較看得懂呢!
用於模擬真實 user 與網頁互動的工具。
安裝:
gem install capybara
** 使用 Capybara 進行端對端測試 **
# spec/features/user_visits_homepage_spec.rb
require 'spec_helper'
feature "User visits homepage" do
scenario "successfully" do
visit root_path
expect(page).to have_content("Welcome")
end
end
用於生成測試資料的套件。
安裝:
gem install factory_bot_rails
** 用 FactoryBot 新增假(for 測試)資料 **
# spec/factories/users.rb
FactoryBot.define do
factory :user do
first_name { "Aiko" }
last_name { "Chen" }
end
end
# spec/models/user_spec.rb
require 'rails_helper'
RSpec.describe User, type: :model do
it "returns full name" do
user = create(:user)
expect(user.full_name).to eq("Aiko Chen")
end
end
接下來會繼續談到:如何設定與執行測試環境、TDD
敬請期待我們明天見!